/* 树状数组
* 1.时间复杂度:
    快速求前缀和 O(logn)
    修改某一个数 O(logn)    

* 2.原理:
    二进制
    (L, R] 区间长度就是每个二进制对应的1的值, 区间就可以表示成(R-lowbit(R)+1, R] 其中lowbit为求R对应二进制最后一位(最低位)"1"所对应的次幂
    C[R]表示以i结尾, 长度为lowbit(R)的 (R-lowbit(R)+1, R]
    C15 = (15 - 2^0, 15] C8 = (8-2^3, 8]

    子节点找父节点:
        依次枚举当前最低为位"1"的之前(高位)的最低位"1", 枚举的所有数即当前节点会影响的父节点

    最后一位"1"之后即全为0, 子区间以递归的思想依次枚举
    e.g. 当末尾有k个0, 即k+1位为最后一位1时, Cx表示以x结尾, 长度是2^k的区间和
         求子区间时, 从低位向高位依次枚举最低位1, 且之前至k+1位全部为1

* 3.code
    lowbit:
        int lowbit(int x)
        {
            return x&-x;
        }

    更改：ax + c 1~x 
            for(int i=x;i<=n;i+=lowbit(i)) tr[i]+=c; tr树状数组哈希表

    查询：
        for(int i=x;i;i-=lowbit(i)) sum+=tr[i];

    

* 本题: 
    区间加，区间求和
    与P242只有询问不同, P242为范围查询, P243为范围查询
    维护两个树状数组即可
    差分数组d[i]的树状数组tr[i]
           i*d[i]的树状数组tri[i] 
    前缀和sum[n] = (d1+d2+……+dn)*(n+1) - (1*d1 + 2*d2 + …… + i*di + …… + n*dn)
*/

#pragma GCC optimize("O1,O2,O3,Ofast")
#pragma GCC optimize("no-stack-protector,unroll-loops,fast-math,inline")
#pragma GCC target("avx,avx2,fma")
#pragma GCC target("sse,sse2,sse3,sse4,sse4.1,sse4.2,ssse3")

#include <iostream>
#include <cstring>
#include <algorithm> 
#include <vector>
// #define ONLINE_GUDGE
#define int long long
using namespace std;
#define lowbit(x) (x&-x)
const int N = 1e5 + 10;

int n, m;
int a[N], tr[N], tri[N]; 
/*
原始数组 
great[i]:a[i]~n之间,一共有多少个数 
lower[i]:1~a[i],一共有多少个数
差分数组d[i]的树状数组tr[i]
           i*d[i]的树状数组tri[i] 
*/

inline int ask(int c[], int x)
{
    int res = 0;
    for(; x; x -= lowbit(x))
       res+=c[x];

    return res;
}

inline void add(int tr[], int x, int c)
{
    for(; x <= n; x += lowbit(x))
        tr[x] += c;
}

inline int Sum(int x)
{
    return ask(tr, x) * (x+1) - ask(tri, x);
}

signed main()
{

    #ifdef ONLINE_JUDGE
    ios::sync_with_stdio(false);   
	cin.tie(0);
    #else
    freopen("./in.txt","r",stdin);
    #endif

    cin >> n >> m;
    for(int i = 1; i <= n; i++) cin >> a[i];

    for(int i = 1; i <= n; i++)
        tr[i] = a[i] - a[i - 1], tri[i] = tr[i] * i;

    for (int x = 1; x <= n; ++x)
        for (int i = x - 1; i >= x - lowbit(x) + 1; i -= lowbit(i))
            tr[x] += tr[i], tri[x] += tri[i];
    
    while(m--){
        char ch; cin >> ch;
        if(ch == 'C'){
            int l, r, d; cin >> l >> r >> d;
            add(tr, l, d);
            add(tr, r+1, -d); // 前缀和
            add(tri, l, l * d);
            add(tri, r + 1, (r + 1) * -d);
        }
        else if(ch == 'Q'){
            int l, r; cin >> l >> r;
            cout << Sum(r) - Sum(l-1) << endl;
        }
    }
    return 0;
}
